package org.ala.tree.lsm.sstable;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import org.ala.tree.lsm.sstable.block.DataBlock;
import org.ala.tree.lsm.sstable.block.TailBlock;
import org.ala.tree.lsm.tools.BloomFilter;

/**
 * SSTable内存映射
 * <p>	指映射索引部分 + 布隆过滤器
 * <p>	SSTable文件格式
 * <p>	[[数据段] [索引段] [元数据段] [尾]]
 * <p>	其中：
 * <p>		数据段：
 * <p>		索引段：
 * <p>		元数据段：
 * <p>		尾（16字节）：
 * <p>			索引段偏移（4字节），索引段大小（4字节）
 * <p>			元数据段偏移（4字节），元数据段大小（4字节）
 * 
 * @author ala
 * @date 2025年5月28日
 */
public class SSTable<V> {
	/**
	 * 	所在层数
	 */
	protected int level;
	/**
	 * 	文件id
	 */
	protected String id;
	/**
	 * 	文件写入时间戳
	 */
	protected long timestamp;
	/**
	 * 	布隆过滤器
	 */
	protected BloomFilter bloomFilter;
	/**
	 * 	key的索引（直接用红黑树）
	 * 	<p>	保存的是DataBlock的偏移
	 * 	<p>	需要根据key第一个>=key的DataBlock，再从DataBlock中找到真实的键值对
	 */
	protected TreeMap<String, Integer> index;
	/**
	 * 	key的offset对应的DataBlock
	 */
	protected Map<Integer, DataBlock<V>> dataBlocks = new HashMap<>();
	/**
	 * 文件尾信息
	 */
	protected TailBlock tb;
	/**
	 * DataBlock条目数	
	 */
	protected int dataBlockCapacity;
	/**
	 * 数据区数据类型
	 */
	protected Class<V> vclass;
	
	
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public long getTimestamp() {
		return timestamp;
	}
	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}
	public BloomFilter getBloomFilter() {
		return bloomFilter;
	}
	public void setBloomFilter(BloomFilter bloomFilter) {
		this.bloomFilter = bloomFilter;
	}
	public TreeMap<String, Integer> getIndex() {
		return index;
	}
	public void setIndex(TreeMap<String, Integer> index) {
		this.index = index;
	}
	public TailBlock getTb() {
		return tb;
	}
	public void setTb(TailBlock tb) {
		this.tb = tb;
	}
	public Map<Integer, DataBlock<V>> getDataBlocks() {
		return dataBlocks;
	}
	public void setDataBlocks(Map<Integer, DataBlock<V>> dataBlocks) {
		this.dataBlocks = dataBlocks;
	}
	public int getDataBlockCapacity() {
		return dataBlockCapacity;
	}
	public void setDataBlockCapacity(int dataBlockCapacity) {
		this.dataBlockCapacity = dataBlockCapacity;
	}
	public Class<V> getVclass() {
		return vclass;
	}
	public void setVclass(Class<V> vclass) {
		this.vclass = vclass;
	}
}
